package com.ryskoo.framework.core.repository;

import com.ryskoo.framework.core.bean.BasicPO;
import com.ryskoo.framework.core.bean.QueryMessageDTO;

import java.util.List;

/**
 * 
 * @author ruiyun
 *
 * @param <M>
 */
public interface IBasicRepository<M extends BasicPO> {

	/**
	 * 创建实体
	 *
	 * @param m
	 * @return
	 */
	void create(M m);

	/**
	 * 更新整个实体
	 *
	 * @param m
	 */
	void update(M m);


	/**
	 * 游离态更新/新增实体
	 *
	 * @param m
	 */
	void merge(M m);

	/**
	 * 新增或者更新实体
	 *
	 * @param m
	 */
	void createOrUpdate(M m);

	/**
	 * 删除某个实体
	 *
	 * @param m
	 */
	void delete(M m);

	/**
	 * 根据ID批量删除
	 *
	 * @param needDeleteUuids
	 */
	void deletes(List<String> needDeleteUuids);

	/**
	 * 通过ID获得实体对象
	 *
	 * @param uuid
	 * @return
	 */
	M getByUuid(String uuid);

	/**
	 * 不带条件查询
	 *
	 * @return
	 */
	List<M> getAll();


	/**
	 * 不带条件查询ID
	 *
	 * @return
	 */
	List<String> getAllUuids();

	/**
	 * 带条件不带分页查询
	 *
	 * @param qm
	 * @return
	 */
	List<M> queryByCondition(QueryMessageDTO qm, boolean byPage);

	/**
	 * 通过原生SQL查询列表
	 *
	 * @param qm
	 * @param byPage
	 * @return
	 */
	List<M> queryByNativeSql(QueryMessageDTO qm, boolean byPage) throws NoSuchFieldException;

	/**
	 * 带条件不带分页查询ID
	 *
	 * @param qm
	 * @return
	 */
	List<String> getUuidsByCondition(QueryMessageDTO qm, boolean byPage);


	/**
	 * 带条件查询总数
	 *
	 * @param qm
	 * @return
	 */
	int getCount(QueryMessageDTO qm);

	/**
	 * 通过原生SQL查询总数
	 *
	 * @param qm
	 * @return
	 */
	int getCountByNativeSql(QueryMessageDTO qm) throws NoSuchFieldException;

	/**
	 * 批量创建
	 *
	 * @param paramList
	 */
	abstract void batchCreate(List<M> paramList);

	/**
	 * 批量更新
	 *
	 * @param paramList
	 */
	abstract void batchUpdate(List<M> paramList);
}